/**
 * 对象操作工具类
 */
export default class ObjectUtils {
  // 合并对象
  static assign<T extends object, U extends object>(target: T, ...sources: U[]): T & U {
    // 检查目标对象是否为 null 或 undefined
    if (target === null || target === undefined) {
      throw new Error('Cannot assign to null or undefined');
    }
    if (sources == null || sources.length == 0) {
      return Object(target)
    }
    // 将目标对象转换为对象（处理原始类型）
    const to = Object(target);
    // 遍历所有源对象
    for (let i = 0; i < sources.length; i++) {
      const source = sources[i];
      // 跳过 null 或 undefined 的源对象
      if (source !== null && source !== undefined) {
        // 获取源对象的所有自有可枚举属性
        const keys = Object.keys(source) as Array<keyof U>;
        for (let j = 0; j < keys.length; j++) {
          const key = keys[j];
          // 检查属性是否为源对象自身的属性（非继承）
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            // 复制属性值到目标对象
            to[key] = source[key];
          }
        }
      }
    }
    return to as T & U
  }
}